#include <pthread.h>
#include <string>
using namespace std;

//1.真正理解回调函数 
//--> 由外部传一个函数指针，然后通过类内部的方法来 “回调” 传进来的这个函数指针
//--> 把线程的定义和线程所要执行的工作（由外部传进来，也就是回调函数）进行分离！即，线程在创建时执行上层传进来的回调函数 --- 实现了一种软件分层！
//2.构造函数正常初始化，可以在Run方法中创建线程时再赋予各属性具体的值

typedef void(*callback_t)(void*);

class MyThread
{
public:

    void Run()
    {
        _start_timestamp = time(0);
        _isrunning = true;
        pthread_create(&_tid,nullptr,ThreadRun,this);
        _name = "thread-" + to_string(_tid);
    }

    void Entry()
    {
        _cb(_arg);
    }

    static void* ThreadRun(void* arg)
    {
        MyThread* mt = static_cast<MyThread*>(arg);
        mt->Entry(); 
    }

    MyThread(callback_t cb = nullptr, void* arg = nullptr)
    :_start_timestamp(0),_tid(0),_name(""),_isrunning(false),_cb(cb),_arg(arg)
    {}

    ~MyThread()
    {

    }

    void Join()
    {   
        pthread_join(_tid,nullptr);
    }

    std::string GetThreadName()
    {
        return _name;
    }

private:
    uint64_t _start_timestamp;//创建线程时的时间戳
    pthread_t _tid;//线程tid
    std::string _name;//线程名
    bool _isrunning;//线程状态
    callback_t _cb;//回调函数

    void* _arg;      //用于回调函数
};